package todo;

import gui.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 
 * Klasse ein Set mit Aufgaben zurückgeben kann.
 * 
 * @author Michael Weng
 * 
 * 
 *         Benutzung:
 * 
 *         Am Anfang der Klasse (und jedes mal wenn etwas an den Tasks geändert
 *         wurde) einmal aufrufen: TaskSet ts = new TaskSet();
 * 
 *         List<MyTask> tl = new ArrayList<MyTask>(); tl =
 *         ts.getTasks(testDate);
 * 
 *         Gibt eine Arrayliste mit allen MyTask elementen zurück, die das
 *         übergeben Datum (hier testDate) als enddate haben.
 * 
 */
public class TaskSet {

	private static ResultSet rs = null;
	private Connection connection;

	/**
	 * Verbindet zur Datenbank
	 */
	public boolean connect() {

		try {
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager
					.getConnection("jdbc:mysql://win9142.informatik.uni-wuerzburg.de:3306?user=awesomefireballs&password=jesus");

		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} catch (SQLException e) {

			e.printStackTrace();
			return false;
		}

		return true;
	}

	/**
	 * Konstruktor. Verbindet zur Datenbank und schreibt alle Tasks in das
	 * Resultset.
	 */

	public TaskSet() {

		try {
			connect();
			Statement stat;
			stat = connection.createStatement();

			stat.executeQuery("use `sopra-ws12-awesome_fireballs`;");

			rs = stat
					.executeQuery("SELECT Task.*  FROM Task, Calendar, Books, User where Task.idToDo = Calendar.idCalendar AND Calendar.idUser = User.idUser AND User.idUser= "
							+ Test.iduser + " group by Task.idTask;");
			System.out.println("Got Connection!");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Getter für das Resultset.
	 * 
	 * @return rs ResultSet, in dem alle Tasks stehen.
	 */

	public ResultSet getResultSet() {
		return rs;
	}

	/**
	 * 
	 * Ruft Konstruktor auf (der sich mit der Datenbank verbindet und alle Tasks
	 * in das result Set schreibt) und gibt alle Tasks in einer ArrayList
	 * zurueck, dessen Enddatum mit dem übergebenen Date übereinstimmt.
	 * 
	 * @param d
	 *            übergebenes Datum. DIESES SOLLTE DAS FORMAT y-1900, m-1, d
	 *            HABEN!
	 * @return ArrayList mit "MyTask"s
	 * @throws NumberFormatException
	 * @throws SQLException
	 */

	@SuppressWarnings("deprecation")
	public static List<MyTask> getTasks(ResultSet rset, Date d)
			throws NumberFormatException, SQLException {

		List<MyTask> list = new ArrayList<MyTask>();

		try {

			rset.absolute(1);
			do {
				if (rset.getRow() > 0) {

					String stringDate;

					stringDate = rset.getString(4);

					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

					Date enddate = sdf.parse(stringDate);

					// Wenn Datum Stimmt
					if ((d.getYear() == enddate.getYear())
							&& (d.getMonth() == enddate.getMonth())
							&& (d.getDate() == enddate.getDate())) {

						int taskID = Integer.parseInt(rset.getString(1));
						int todoID = Integer.parseInt(rset.getString(2));
						String name = rset.getString(3);
						int priority = Integer.parseInt(rset.getString(5));
						String description = rset.getString(6);

						MyTask aufgabe = new MyTask(name, enddate, priority,
								description, taskID, todoID);
						list.add(aufgabe);

					}

				}
			} while ((rset.next()));

		}

		catch (ParseException e) {
			e.printStackTrace();
			// TODO Auto-generated catch block

		}
		return list;

	}

	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws NumberFormatException,
			SQLException {
		new TaskSet();
		int y = 2013;
		int m = 3;
		int d = 19;
		Date testDate = new Date(y - 1900, m - 1, d);

		System.out.println(testDate);

		List<MyTask> tl = new ArrayList<MyTask>();
		tl = getTasks(rs, testDate);

		for (MyTask mt : tl) {
			System.out.println(mt.getName());
		}

	}

}
